<!DOCTYPE html>
<html lang="zh-Hans">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>
Git分支及远程相关操作
</title>

    


  
  <meta name="author" content="zhitaoZ" />
  <meta name="description" content="No one is a island" />



<meta name="generator" content="Hugo 0.65.3" />

<link rel="canonical" href="https://zhitaoz.github.io/post/learngit2/" />


<meta property="og:title" content="Git分支及远程相关操作" />
<meta property="og:description" content="Git分支及远程相关操作" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://zhitaoz.github.io/post/learngit2/" />
<meta property="article:published_time" content="2020-03-16T08:28:26+08:00" />
<meta property="article:modified_time" content="2020-03-16T17:30:45+08:00" />



<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Git分支及远程相关操作"/>
<meta name="twitter:description" content="Git分支及远程相关操作"/>


<link rel="stylesheet" href="/css/github-markdown.css" />
<link rel="stylesheet" href="/css/semantic.min.css" />
<link rel="stylesheet" href="/css/site.css" />


<style>
  a {
    color: seagreen !important;
  }
</style>



<style>
  .inverted a {
     color: darkseagreen !important;
  }
</style>


  </head>

  
  <body style="background-image: url(/me/background.jpg);">
  
    <div class="flip-container">
      <div class="flipper">
        <section class="front">
          
<nav class="ui secondary inverted menu dream-menu">

  <div class="item">
    <i class="large link bullseye icon dream-flip-toggle" title="Flip it!"></i>
  </div>
  <div class="item">
    <i class="large link home icon" title="Home" onclick="window.location.href = 'https:\/\/zhitaoz.github.io\/'"></i>
  </div>
  <div class="item">
    <i id="theme-switch" class="large link icon" onclick="themeSwitch()"></i>
  </div>
</nav>

          
<div class="ui centered relaxed grid dream-grid">
  <div class="sixteen wide mobile sixteen wide tablet twelve wide computer column markdown-body dream-single">

    <section class="ui top attached segment" id="dream-save-post-as-img">
      <header style="margin-top: 0 !important;">
        <h2 class="ui header">
          Git分支及远程相关操作
          <div class="sub header">@ zhitaoZ · Monday, Mar 16, 2020 · 2 minute read · Update at Mar 16, 2020</div>
        </h2>
      </header>
      <article style="margin-top: 2rem;"><p>Git分支及远程相关操作</p>
<h2 id="分支操作">分支操作</h2>
<p>通过灵活运用分支，可以让多人同时高效地进行并行开发。</p>
<h3 id="git-branch---显示分支列表">git branch&mdash;显示分支列表</h3>
<p>git branch命令可以将分支名列表显示，同时可以确认当前所在分支。让我们来实际运行 git branch命令。</p>
<pre><code class="language-git" data-lang="git">$ git branch
* master
</code></pre><p>可以看到 master 分支左侧标有“*”（星号），表示这是我们当前所在的分支。也就是说，我们正在 master 分支下进行开发。结果中没有显示其他分支名，表示本地仓库中只存在 master 一个分支。</p>
<h3 id="git-checkout--b创建切换分支">git checkout -b——创建、切换分支</h3>
<p>如果想以当前的 master 分支为基础创建新的分支，我们需要用到 git checkout -b命令。<br>
不断对一个分支进行提交的操作，我们称为“培育分支”。<br>
其他分支的更改不会影响到 master 分支，这正是在开发中创建分支的优点。只要创建多个分支，就可以在不互相影响的情况下同时进行多个功能的开发。</p>
<pre><code class="language-git" data-lang="git">git checkout -
</code></pre><p>像上面这样用“-”（连字符）代替分支名，就可以切换至上一个分支。</p>
<h3 id="特性分支">特性分支</h3>
<p>Git 与 Subversion（SVN）等集中型版本管理系统不同，创建分支时不需要连接中央仓库，所以能够相对轻松地创建分支。因此，当今大部分工作流程中都用到了特性（Topic）分支。<br>
特性分支顾名思义，是集中实现单一特性（主题），除此之外不进行任何作业的分支。在日常开发中，往往会创建数个特性分支，同时在此之外再保留一个随时可以发布软件的稳定分支。稳定分支的角色通常由 master 分支担当。<br>
基于特定主题的作业在特性分支中进行，主题完成后再与 master 分支合并。只要保持这样一个开发流程，就能保证 master 分支可以随时供人查看。这样一来，其他开发者也可以放心大胆地从 master 分支创建新的特性分支。</p>
<h3 id="主干分支">主干分支</h3>
<p>主干分支是刚才我们讲解的特性分支的原点，同时也是合并的终点。通常人们会用 master 分支作为主干分支。主干分支中并没有开发到一半的代码，可以随时供他人查看。　　
有时我们需要让这个主干分支总是配置在正式环境中，有时又需要用标签 Tag 等创建版本信息，同时管理多个版本发布。拥有多个版本发布时，主干分支也有多个。　　</p>
<h3 id="git-merge合并分支">git merge——合并分支</h3>
<p>接下来，我们假设 feature-A 已经实现完毕，想要将它合并到主干分支 master 中。首先切换到 master 分支。</p>
<pre><code class="language-git" data-lang="git">$ git checkout master
Switched to branch 'master'
</code></pre><p>然后合并 feature-A 分支。为了在历史记录中明确记录下本次分支合并，我们需要创建合并提交。因此，在合并时加上 &ndash;no-ff参数。</p>
<pre><code class="language-git" data-lang="git">git merge --no-ff feature-A
</code></pre><p>随后编辑器会启动，用于录入合并提交的信息。</p>
<pre><code class="language-git" data-lang="git">Merge branch 'feature-A'

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
</code></pre><p>默认信息中已经包含了是从 feature-A 分支合并过来的相关内容，所以可不必做任何更改。将编辑器中显示的内容保存，关闭编辑器，然后就会看到下面的结果。</p>
<pre><code class="language-git" data-lang="git">Merge made by the 'recursive' strategy.
 README.md | 2 ++
 1 file changed, 2 insertions(+)
</code></pre><p>这样一来，feature-A 分支的内容就合并到 master 分支中了。</p>
<h3 id="git-log---graph以图表形式查看分支">git log &ndash;graph——以图表形式查看分支</h3>
<p>用 git log &ndash;graph 命令进行查看的话，能很清楚地看到特性分支（feature-A）提交的内容已被合并。除此以外，特性分支的创建以及合并也都清楚明了。<br>
git log &ndash;graph命令可以用图表形式输出提交日志，非常直观.</p>
<h2 id="更改提交的操作">更改提交的操作</h2>
<h3 id="git-reset---回溯历史版本">git reset&mdash;回溯历史版本</h3>
<p>Git 可以灵活操作历史版本，借助分散仓库的优势，可以在不影响其他仓库的前提下对历史版本进行操作。<br>
要让仓库的 HEAD、暂存区、当前工作树回溯到指定状态，需要用到 git reset &ndash;hard命令。只要提供目标时间点的哈希值 ，就可以完全恢复至该时间点的状态。
git log命令只能查看以当前状态为终点的历史日志。所以这里要使用 git reflog命令，查看当前仓库的操作日志。</p>
<h3 id="消除冲突">消除冲突</h3>
<p>多分支合并时可能会对同一个文件进行不同操作导致出现冲突，不解决冲突无法完成分支的合并。<br>
解决冲突经常要删除一个不同的修改，或者包含两个修改。</p>
<h3 id="git-commit---amend修改提交信息">git commit &ndash;amend——修改提交信息</h3>
<p>对“”里面的注释内容进行修改。</p>
<h3 id="git-rebase--i压缩历史">git rebase -i——压缩历史</h3>
<p>在合并特性分支之前，如果发现已提交的内容中有些许拼写错误等，不妨提交一个修改，然后将这个修改包含到前一个提交之中，压缩成一个历史记录。<br>
小小的变更就没必要先执行 git add命令再执行 git commit命令了，我们用 git commit -am命令来一次完成这两步操作。</p>
<pre><code class="language-git" data-lang="git">git rebase -i HEAD~2
</code></pre><p>用上述方式执行 git rebase命令，可以选定当前分支中包含 HEAD（最新提交）在内的两个最新历史记录为对象，并在编辑器中打开。</p>
<pre><code class="language-git" data-lang="git">pick 7a34294 Add feature-C
pick 6fba227 Fix typo
</code></pre><p>我们将 6fba227 的 Fix typo 的历史记录压缩到 7a34294 的 Add feature-C 里。按照下所示，将 6fba227 左侧的 pick 部分删除，改写为 fixup。</p>
<pre><code class="language-git" data-lang="git">pick 7a34294 Add feature-C
fixup 6fba227 Fix typo
</code></pre><p>保存编辑器里的内容，关闭编辑器。</p>
<pre><code class="language-git" data-lang="git">[detached HEAD 51440c5] Add feature-C
 1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/feature-C.
</code></pre><p>系统显示 rebase 成功。也就是以下面这两个提交作为对象，将 &ldquo;Fix typo&quot;的内容合并到了上一个提交 &ldquo;Add feature-C&quot;中，改写成了一个新的提交。</p>
<pre><code class="language-git" data-lang="git">7a34294 Add feature-C
6fba227 Fix typo
</code></pre><h2 id="推送到远程仓库">推送到远程仓库</h2>
<h3 id="git-remote-add添加远程仓库">git remote add——添加远程仓库</h3>
<h3 id="git-push推送至远程仓库">git push——推送至远程仓库</h3>
<p>-u参数可以在推送的同时，将 origin 仓库的 master 分支设置为本地仓库当前分支的 upstream（上游）。添加了这个参数，将来运行 git pull命令从远程仓库获取内容时，本地仓库的这个分支就可以直接从 origin 的 master 分支获取内容，省去了另外添加参数的麻烦。</p>
<h2 id="从远程仓库获取">从远程仓库获取</h2>
<h3 id="git-clone获取远程仓库">git clone——获取远程仓库</h3>
<p>执行 git clone命令后我们会默认处于 master 分支下，同时系统会自动将 origin 设置成该远程仓库的标识符。也就是说，当前本地仓库的 master 分支与 GitHub 端远程仓库（origin）的 master 分支在内容上是完全相同的。<br>
我们用 git branch -a命令查看当前分支的相关信息。添加 -a 参数可以同时显示本地仓库和远程仓库的分支信息。</p>
<h3 id="git-pull获取最新的远程仓库分支">git pull——获取最新的远程仓库分支</h3>
<p>如果两人同时修改了同一部分的源代码，push 时就很容易发生冲突。所以多名开发者在同一个分支中进行作业时，为减少冲突情况的发生，建议更频繁地进行 push 和 pull 操作。</p>
<hr>
<p>学习内容来自《GitHub入门与实践》</p></article>
    </section>

    <footer class="ui attached segment dream-tags">
      
        
          <a class="ui label" href="/tags/git" title="git">git</a>
        
      
      <div
        class="ui label"
        style="float: right; background: #1b1c1d !important; cursor: pointer;"
        onclick="savePostAsImg()">
        <i class="save icon"></i> Save as image
      </div>
    </footer>

    

    

  </div>
  <div class="sixteen wide mobile sixteen wide tablet four wide computer column">
    <article class="dream-header">
  <section class="ui top attached center aligned segment">
    <div class="ui small circular image">
      
        <img src="/img/psb25.jpg">
      
    </div>

    <h3 class="ui header">zhitaoZ&#39;s blog<div class="sub header" style="margin-top: 0.5rem;">No one is a island</div>
    </h3>

    <div class="ui horizontal list">
      
      <a class="item" href="/tags">
        <i class="tags icon" title="All Tags"></i>
      </a>
      <a class="item" href="/categories">
        <i class="th list icon" title="All Categories"></i>
      </a>
    </div>
  </section>

  
  <section class="ui attached center aligned segment dream-tags">
    
      <a class="ui label" href="/tags/c" title="c">c</a>
    
      <a class="ui label" href="/tags/git" title="git">git</a>
    
      <a class="ui label" href="/tags/markdown" title="markdown">markdown</a>
    
      <a class="ui label" href="/tags/%E7%BD%91%E7%AB%99" title="网站">网站</a>
    
  </section>
  

  
  <section class="ui attached segment dream-categories">
    <div class="ui accordion">
      
        <div class="title">
          <i class="dropdown icon"></i>
          <a href="/categories/%E8%87%AA%E5%AD%A6" class="item">自学</a>
        </div>
        <div class="content">
          <div class="ui list">
          
            <div class="item">
              <div class="content">
                <a href="https://zhitaoz.github.io/post/learnmd/" class="item">Markdown 基础语法</a>
              </div>
            </div>
          
            <div class="item">
              <div class="content">
                <a href="https://zhitaoz.github.io/post/learngit3/" class="item">Git 尝试pull request&amp; 接收pull request</a>
              </div>
            </div>
          
            <div class="item">
              <div class="content">
                <a href="https://zhitaoz.github.io/post/learngit2/" class="item">Git分支及远程相关操作</a>
              </div>
            </div>
          
            <div class="item">
              <div class="content">
                <a href="https://zhitaoz.github.io/post/learngit1/" class="item">Git基本操作</a>
              </div>
            </div>
          
            <div class="item">
              <div class="content">
                <a href="https://zhitaoz.github.io/post/learnc5/" class="item">C语言基础知识(五)</a>
              </div>
            </div>
          
            <div class="item">
              <div class="content">
                <a href="https://zhitaoz.github.io/post/learnc4/" class="item">C语言基础知识(四)</a>
              </div>
            </div>
          
            <div class="item">
              <div class="content">
                <a href="https://zhitaoz.github.io/post/learnc3/" class="item">C语言基础知识(三)</a>
              </div>
            </div>
          
            <div class="item">
              <div class="content">
                <a href="https://zhitaoz.github.io/post/learnc2/" class="item">C语言基础知识(二)</a>
              </div>
            </div>
          
            <div class="item">
              <div class="content">
                <a href="https://zhitaoz.github.io/post/learnc1/" class="item">C语言基础知识(一)</a>
              </div>
            </div>
          
            <div class="item">
              <div class="content">
                <a href="https://zhitaoz.github.io/post/bblog/" class="item">hugo搭建博客步骤(windows)</a>
              </div>
            </div>
          
          </div>
        </div>
      
    </div>
  </section>
  

  <section class="ui bottom attached center aligned segment">
      
      <p>© 2020 zhitaoZ&#39;s blog</p>
      
      <p>Powered by <a href="https://gohugo.io/" target="_blank">Hugo</a> with theme <a href="https://github.com/g1eny0ung/hugo-theme-dream" target="_blank">Dream</a>.</p>
  </section>
</article>

  </div>
</div>

        </section>
        <section class="back">
          
<nav class="ui secondary inverted menu dream-menu">

  <div class="item">
    <i class="large link bullseye icon dream-flip-toggle" title="Flip it!"></i>
  </div>
  <div class="item">
    <i class="large link home icon" title="Home" onclick="window.location.href = 'https:\/\/zhitaoz.github.io\/'"></i>
  </div>
  <div class="item">
    <i id="theme-switch" class="large link icon" onclick="themeSwitch()"></i>
  </div>
</nav>

          <div class="ui centered relaxed grid dream-grid dream-back">
  

  <section class="sixteen wide mobile eight wide tablet four wide computer column dream-column">
    <article>
      <div class="ui top attached segment">
        <h3 class="ui header">Social Links</h3>
      </div>
      <div class="ui attached segment">
        <nav class="ui secondary menu dream-menu">
          
            <div class="item">
              <a href="mailto:zhangzhitao@bupt.edu.cn">
                <i class="large mail icon" title="email"></i>
              </a>
            </div>
          

          
            <div class="item">
              <a href="https://github.com/zhitaoZ" target="_blank">
                <i class="large github icon" title="github"></i>
              </a>
            </div>
          

          

          

          
        </nav>
      </div>
    </article>
  </section>

  <section class="sixteen wide mobile eight wide tablet four wide computer column dream-column">
    
  </section>

  
  

</div>

        </section>
      </div>
    </div>

    <script src="/js/jquery.min.js"></script>
<script src="/js/semantic.min.js"></script>
<script src="/js/imagesloaded.pkgd.min.js"></script>
<script src="/js/masonry.pkgd.min.js"></script>
<script src="/js/nav.js"></script>
<script src="/js/header.js"></script>
<script src="/js/main.js"></script>
<script src="/js/theme.js"></script>
<script src="/js/html2canvas.min.js"></script>



  </body>
</html>
